﻿const Koa=require("koa");
const path=require("path");
const serve=require("koa-static");
const koaBody=require("koa-body");
const Router=require("koa-router");
const https=require("https");//核心模块
const Database=require("better-sqlite3");
const app=new Koa();

const router=new Router();
const db=new Database(path.join(__dirname,"./wechat.sqlite"),{
    fileMustExist:true,
    verbose:console.log
});


const httpsRequestPromise=function(url=""){
    return new Promise(function(resolve,reject){
        https.get(url,function(res){//res服务器的响应对象(包含成功和失败)
            res.on("data",resolve);//监听请求成功，并完成回调执行
            res.on("error",reject);//监听请求失败，并完成回调执行
        }); 
    });
};

let staticPath=path.join(__dirname,"./public/");
app.use(serve(staticPath));
app.use(koaBody({
    multipart:true,//支持文件上传
    formidable:{
        uploadDir:path.join(__dirname,"./public/upload"),//设置上传文件由二进制转换成文件后的服务器存放目录，文件存储时候会完成重新命名操作
        keepExtensions:true//设置保留上传文件类型的后缀，默认false
    }
}));

router.post("/jscode2session",async function(ctx){
    let params=ctx.request.body;

    // https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

    let code=params.code;//登录凭证code
    let appId="wx4d521cf7b005ad43";
    let secret="31dbc3c6afa854ef33ed21609effc070";
    let url=`https://api.weixin.qq.com/sns/jscode2session?appid=${appId}&secret=${secret}&js_code=${code}&grant_type=authorization_code`;
    let resultBuffer=await httpsRequestPromise(url);//返回的是二进制数据
    let wechatStr=resultBuffer.toString();//将二进制数据转换为字符串(JSON格式的字符串)
    let wechatObj=JSON.parse(wechatStr);
    
    let sql=`
        select id,openId,phone,nickname,img 
        from t_user 
        where openId=?
    `;
    let user=db.prepare(sql).get(wechatObj.openid);//根据openid查询数据库中是否该用户已经存在（登录）
    if(user){
        ctx.body={
            isLogin:true,
            openid:wechatObj.openid,
            user:user
        };
    }else{
        ctx.body={
            isLogin:false,
            openid:wechatObj.openid,
           
        };
    }
  
});

router.post("/loginAndRegist",async function(ctx){
    console.log("======================");
    let params=ctx.request.body;
    let sql=`
        select id,openId,phone,nickname,img 
        from t_user 
        where openId=?
    `;
    let user=db.prepare(sql).get(params.openid);//根据openid查询数据库中是否该用户已经存在（登录）
    if(!user){
        let addUserSql=`insert into t_user (openId,phone,nickname,img) values (?,?,?,?)`;
        db.prepare(addUserSql).run(params.openid,params.phone,params.nickname,params.img);//插入用户操作
        user=db.prepare(sql).get(params.openid);//插入完之后立马根据openid查询该用户

    }   
    ctx.body={
        isLogin:true,
        openid:params.openid,
        user:user
    };

});

/* 
router是路由对象，用于提供定义时地址和回调函数之间的对应关系
router完成关系定义后，由router.routes()方法指向完成路由表的生成
    路由表->一段由js的路由和方法对应的判断逻辑 */
app.use(router.routes());

app.listen(3000);